@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu  } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED736 FREE SECTORS COPYING---D1:DIRECK.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 138ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uBB@ԭЍ`,lHHHLL+H) ߍҥl H-Il8%,LIҥm#T}hlMh@h,l,lh hH)HlHh@@ 6 LMMMU}NOEO%NТ U O¥B)L­д ԍ5 ԍ41ԭ0ԭ/ԭoЭll8l)ԢXEO%NV} ԭԢ U R¢ U&)+>)2+2m-+ ɟ ɃɄɔ)? ҍL+W}JJJJy{)xzЍЍҝpt ҢxJJJ}*|ʈl$l&l(`X}` - -`hhh@x/j 'D" x=\>ɓ?%ȩxآ qĩRFY}F# `eD" W cʩ)\=>%?Z}R'S) 0b%Kĝ.ĝ 5XLß_^ZX][suLPర  )ĩBHD[}ĝE J VL  nƥj 9D )ll l`P0C@ESK BOOT ERRORE:,0\}­j l ĭ ӥ))ө(I I`}`ӝ]}Нԝ<өө8Ӎөөө<Ӎӭӭө"ҩҍҩ(ҩ `67  ^},  L n e k Pn8ɍ9 )I` )3L;ƩS S0!   Y >ƭ`@BC_}  iiA  Y >ƭЬ Y )ư ; `BiCill =ĊDE BHLV`}LzRLS )'Lƭ> } ũ  `lF`1F!@PWa}S  Y`S :ǠF! :Ǡȱȱ򈈌 ``3b} Ǡ9 Ǡ/E &*ȍȍE3 Ǡ 3` Ǡ, Ǡ"Emm`lc}l3 sJjK J}K}mEHmh8Hh Hh hd}h`8H3m6m7h6LPm6m76m6676m6`m6m76}6`H3jhm6m7e}6`mmm6ǒȒȒȒmmȵȵǕǩD)LHHѭɀ ɑ H`LHG f}H hH qhB`jHH ʍH hHhh@LɠLɠLɠLɠ Lɠ L H`G=!g}H` H HLM`LMBHB HH ɐ LhhLʠHhBLMM`hh̀@ .M  .L h}.@ L\LӍh`h`ӱHh`ӑ`ӱ2`ӑ2`@ e˩֭'L1 ei} W s cʘ` W U cʘ`BL8 cʩ2LW cʭё2 LWʭ W R cl" W U QLc,pH gj} W 1W ch@ chl)#%qJiI`֎֢֩֎֍`Wql234 545RЭ) k}7,pР2ɛ ֢֩֍23454L˩,`hhhhhhhhhhhL,x X` l}@)`JJJJJJN%` ߥӱێӑ`ߍӱ٦ӑ`Ӆ 2 ;` ; 2̥LRLf |̥&e݅Hm} hL̤ ̥` ̥8ׅ۰eׅݩװL̢8թբ<Սթ8թթ<ՠ`<L< n}P L*ͩP͙`X8Lͪ0`ixJL͊ 0ɛ թ4թ<L͠X`XLL,`h`h`o}MVLh8`p}q}r}s}ARGS-OSL,LLLLLLLLLLLLLLLLw䀲뚀t}䀙߿ээ э эѩээ ѩээ э ``e`+Pѩ ѩѭэa ѭэb ѭэc ѭu}эd`````)`+P` hP b a# ѩѭ  ѭ Ѱ PLP ѩѭ  ѭ ѐ эѭv}) PLPLQc ѭdѭa b #  Im э ѐab[ эcэd Ɂ6LQ Q23 ʠw}` Qэf Qэg Q` Q Q`23 ʠ` `)` 3PUX( R'PXx R%#$x} эѽ+PѭɀAɂ= ѭх" ѠXȥ#8XȩX## ёX "P R TLw`ʽ)? ߵy}%`+Pѩ ѭ&hj B VB Ve1Y@XT`eXXY`x"ԩЩ Щ Ժi z}'H T pT3 T 0T T) L)S L)S? SL)S Sh(Xl`{} S yL)S T T 24LSݼT iǘhhL)S)LS!)論 |} 0  `ԩTԠ'`b T pT pT jʙ pT牢 `HJJJJ ih)}} i`) )) T `ppppBTpBAT2350?:*8-)#2/-/.# 2$avid; !*[=2 ԩi~}`W`W09LʢH)WA A0Wh W0ǘ 0:; < =xW}ҩҩ605:23 44 U234 5, U V,P 0Vҥ V0X`# W ʅ1 } V 35451 V) VLV1 V W3545 V1` 0LU0,06L}U(ҮWLUjj)?j) V W< VAC Eв0c&V'L\) ߍҩҭҍ )  `LcVH})ҩh Үe1i1`ҍ ҩ(ҩҩ`?@He) g Uݯ hhhLJ˩ҥҊ e }` hPh`} ۰9 Hڢ D ۰!H hم٦0hL`.Eh+-X }7H ۰H ehe ۥ Iihe+- ې08H*hj ۥiD ܰ  ` }Qک0()?(E$8? p .L L٩` p 8逮0iE ܄ 8}-+ ܢ8 i H h ܭ0 ii ܠ-`ԅՅ D&uԕةBLܩ0fCb8}@?i ZڰS ZڰF ZڰAee2 ei$  iiԥ`8`Ԡ``&&}`I))8Դ0 >E0uذLܩ :ܩLܢ8LܥI8ՕL}E> 8@8e08 ܥ)0 LڥJJJJ0 L bץL D`8` 8i@0 LNۢՕ 8}ؐ ٠8ؐ е bL ۤȄ` `80 `H ې.+-h8` } . ېh`ՠ66666&`ڢ.`)q` D`ʈ}e` ԕ` 8JJJJ ܵ) . ` 0` .0ʽ` ۥ)`8`}E)F)`ԅ ( ۥ) 4 D`ߠߠyʈ``` } ݦ - ڰ(ii fڰ  0````ԕ` }ڰԅ)8@0&j ٥ԅX ݢ `ک M @ ڥ#ji@0 ڥ ݢ } (`8`==W3>Tvb>2b'?h`06?2'A?%C4Vu?f'70P@U??CBH@ ݦ fڢ ݢ ݦ `ڢ} (`0L8`@ ) (ۢf ޢ ک r @ݢ ڢl f ݩեI}i $ԅ fڥ (`@"wf?P?IWQpIG?9 Wa9cU? 0d? 9`?BXGB?7?()q?D>DIh8E?h}yx? )D?@ (1V?wD3331??xS4ԅ8Lfffffff>`<|fl0fF68of;}p88pf< 80 0 ~~`0 0```nf>ff~fff~~f<flxxlf`````~cwkccfv~~nf}8pp8?ww<~~~<}x`x`~<~~<0~0 ~ <~~<<>f>``|ff|<```<>ff>}>ff>|``|fff8<<``lxlf8<fkc|ffffff>|f```>`<|~}ffff>fff<ck>6f< x~ 0~<~~<~x|nf8x8-I,Ln-Ln},,LnLyLLLLL3LrLLL\LL LL#LLLLL#LPLLLɕɚɟɤɩL ɢ}_j 3PLhP`@۝FGiɀ``/.)Lp@ " qLp )0}"%*H_vL Lp' "  ,&-'Lr Lp#  'ۅ&Lr } 氥 .@ Lr"%*Lp () /Lr /0A$ ") /ɛ L ۥ") /0 /ɛ󩉅# $ } Lr"%*Lp ()/($/  (0")/ɛ()ۥ") Lr#.D$E% @ /.}#` ",-*稱,ȱ,-,`()(()`$%$`$%`.8H((I))` #`-H,H.`8$10 !}!$ ! 8` ` %JKJqJ&JKJ V O- `mm8} N Ln 08 ݐH  h LYO@@ʎj}LEǮ}` 38` Q LY&@JKJȱJ`}8`JK V8( ]'JȭJJKJJ  (8`( JȑJqJȭqJJ VˠJ`Ji} KilLr ];JHKHJKDJqJ VJȱJhKhJJJ`hh8`L3ɩ<ө<ө2A`B`L} (ҩmi:; < =:2i4354 ?ΜL"  / ? },p? ?00ν0L B0`?>2i435< 0>A!CE000Ɋ}?0`0 1;:2 ҅1L: `H232435; 1 ҩ;  hh@2 e1i1L; :)}h@1890 @<ӥL9`0`Hҍ 00) 08 109hh@ Ҡ2e1i1232435}ޥ<<Щ82m43m 5`2̍ҩ b 0 4ӭ Lb 0 4ӭ} = 0<L*`-2 ` Ҡҍ2ҩ% LV-2 2ҍ ҩ% ҩ(ҢA}Ҭ`ҍ`%Ң`jj)?j)`,  7` .  . 8 8} b8}mJJJ 8)i 8}}`|08|`b}`Lx%) Ԥ   }[XL')0 Ԥ ҭҭҩҭ2ҩU2ȑ212i23i3X` <ө<ө0XL*&}'x \X`CT euxd   4dd //__aaaa a ''OOAAAA A  }((PP@PPP(( 00`` 0 @ HH"0"0h}h8`hh8`hh`$! ` %&'.M$L`HH)  hh`0.@ 0 )0hh'}H&H`Lj@Qyz`a`+)*)*WLT̍k/Lҩ@,n č}ԩd{j`WMQje( zo)?g jjj)g z odXeY} z x]de edheiA pfW  9*)3n  ij p` pB ief-f-W n} "QQ pW& ]j8 p pQ @ pQ pY pX pQ @ pp pp pd0e1p pde0hȭ1h}L `*) R" //L j L d-FoJ`} L ɛ aL L }TZ****))I Fo L-PI1dPd` ]W I LL&LȩL`,n@ԩn΍L }b k4TlUm Lɛ bcq VL\  lTmUkk L0 Lb a LLbld b   < } Lb i- de Lb*Joe| бy0LɀɁ I}ɂ  Ƀ@ИɄLɅ LLɉI LɎɊ| `L*ɒ Ɏr&|@a}{ |L# < ML򩀍`TʆTL TTͿUU0RSULUUSRL dddeej} cmTVl`cR!UR # UST  L UR e Xc ]LcL>cLJ L } cH hc }}H }hL Wλ0TL L dheicH hcTͿ hڠh  WL8 RU L QTT8 [ix( <} U * XL ` @Ln L0+dL0d8dee dL` p p`fʆeT }&e &eeTdeWmd&eVJUjfedeeXd^eeYe_%Uefo`}cUVUW} SސV}ԥW,cQ }" aL eTix ]} L} VTW${T)#}ɛ llΝ8뭝TL8}ptpquq`W 'SSWT*( VV}U L` @Lhh{LbL_]^`H)nh}JJJ`...` #n` #nI=`Tix #%n8`W ****))M`jʆigh؅fT'h}f8hf(higiL Ziy( <0TTix(LfhdgsaL}J:K\^OPUI_|VCBXZ$#&%"![ ]NM?REYTWQ()'@}FHDGSA {   ` }}HHӭ ImɃIm )&= Ҫɟ I)?.M+//h}hh@!ϭkk п)Lm/͍/HMO-N ԍh@L̍`+>*) >`? 0)4}Ӧb* \*=Lw` 0̍ҩҩ` h4Ӧb \**=`?03=}=`R ?0= Lz?`==` |=``0<`=  |0 |L@b}}ЩР@b} 6`%H$H` `#@R>  Y`}UW ?`@ `S   Y0 D` `HA! Khɛ` } LY Kܠ`@!S@ ``W+N(DS  `NܭR }S8` 3Pfga b hP`+Pѭ  LP`23f2ȭg2ȩ2ȩ2`XBB}l,` 3Pfga b hP`+Pѭ  LP`23f2ȭg2ȩ2ȩ2`XBB Here it is, ARGS-OS 3. It is a modified ROMDisk OS by Ralf David / Klaus Peters, but Klaus Peters (distributer) agreed that R }oland Buehler uses it. ARGS-OS 3 was mainly made by Roland Buehler but I did the final work, so here is my doc: If you want } to use it, you'll have to UNARC the file ARGSOS3.ARC and burn it on an 128KBit-Eprom (27128). Then either replace the old OS } with it or use a switch to select between them (I hope you know how). ROMDisk-OS features: ==================== - highspe }ed SIO-routine for upgraded drives (about 76000 baud) (if it fails use function key + Shift-Control-U) - mini-monitor: S }tart with function-key + Shift-Control-M (use with +, *, Shift-+, Shift-*, A, ESC) - supports the ROMDisk (of course) Add }itional ARGS-OS features: ============================ - supports the ARGS-Centronics-cartridge (if this cart is not fitte }d, the normal P:-handler is used) - includes the ZRAM-DMA routine to use expansion-Ram Disadvantages: ============== - T }he monitor-function conflicts with the Shift-Control-M command of ACTION! - No self-test (have you ever needed it?) - no in }ternational charset - any expansion using $D506 may confuse the "P:"-handler - a small bug for all users without ROMDisk: t }he ROMDisk-OS was mainly build to support the ROMDisk - it doesn't check wether a ROMDisk is plugged in or not. If you wa }nt to use "D2:" you'll have to put the non-existing ROMDisk to another number (function key + Control + Number). In the n }ext weeks I won't have time to fix this, sorry. =============================== Important Pokes in the ARGS-OS: =========== }==================== $CFC8-$CFCE (53192-53198): ASCII-String "ARGS-OS" $CFCF (53199): version (now: 3) $CFD0-CFE7 (53200-53 }223): jumptable $CFE8-CFFF (53224-53247): jumptable for BASIC used |normal |BASIC entrie }s: |Hex |Decimal |Hex |Dezimal ----------------+---------------+---------------+--------- }------+-------- ZRam-DMA |$CFD0 |53200 |$CFE8 |53224 ----------------+---------------+----- }----------+---------------+-------- don't care if you don't have the ARGS-Centronics-cart: EOL <-> CR | | } | | translation: | | | | Off |$CFD3 } |53203 |$CFEB |53227 On |$CFD6 |53206 |$CFEE |53230 ---------- }------+---------------+---------------+---------------+-------- How to use the normal ZRam-DMA: ---------------------------- }--- The ZRam-DMA uses several bytes ($D6 - $E2) in the Zeropage. If you use the routine from a language other than BASIC, you }'ll have to set the following variables: mode ($D6): 0 -> read from expansion memory else -> write into expansio }n memory ZRam-address ($D7/$D8): address in the expansion memory normal adress ($DB/$DC): address in the normal RAM length } ($DD/$DE): length of the block to transfer block ($DF): mask for the chosen block (see below) Then just jump to $CFD0. H }ow to use it with BASIC: ------------------------- No Peeks, no Pokes, just one USR-routine: A=USR( 53224, , < }address in expansion Ram>,
, , ) (in BASIC this call has to be in ONE line, of course) mode: '4' means "read from expansion Ram" '8' }means "write into expansion Ram" Example: The command A=USR( 53224, 4, 10000, ADR(A$), 3333, 224 ) reads 3333 Bytes fro }m the expansion Ram (address 10000, block 224) into the string A$. How to choose a block: --------------------- With 'block }' I mean a sequence of 4 banks, e.g. $E3, $E7, $EB, $EF or $23, $27, $2B, $2F The routine takes the chosen block, adds a }value ($03, $07, $0B or $0F) and switches to the corresponding bank like: POKE PORTB, (block OR <3/7/$B/$F>) AND PEEK(PORTB) } You don't have to worry about this if you have a XE-compatible expansion. Reasonable values for blocks are: 64K expansion }RAM: $E0 (224) 256K expansion RAM: $E0 (224) $A0 (160) $60 (96) $20 (32) I am not quite sure how to use it with an 1MB Axlo }n-expansion - any suggestions are welcome! I think it does not work with a 4MB expansion, but if anyone needs this by all me }ans then write to me! Users who want to use it with a Peters 1MB-expansion have to set the segment number (0-3) in $D600 (54 }784), if you want to use the full 1MB. ======== Caution: ======== - Be sure that the highest expansion-address:
+ - 1 is below $10000 (65536)! - Your screenmemory shouldn't be between $4000-$7FFF (16384 - } 32767), or you'll get rubbish on your screen while using the ZRam-DMA. - I tested it with BASIC but until now not (real }ly) with assembler! Bug reports (including errors and insufficent English in this doc), suggestions for improvement and add }itional features (there isn't much space left!) please send to: jscharrl@ba-stuttgart.de Jochen Scharrlach Vordernbergstr. }27 70191 Stuttgart Germany or (if you are also interested in ARGS-Hardware) Roland Buehler Engelgasse 21 72348 Rosenfeld G }ermany 1 Stuttgart Germany or (if you are also interested in ARGS-Hardware) Roland Buehler Engelgasse 21 72348 Rosenfeld G , ө jB*DELVE:d in ARGS-Hardware) Roland Buehler Engelgasse 21 72348 Rosenfeld G9,)ө jB*DELVE:d in ARGS-Hardware) Roland Buehler Engelgasse 21 72348 Rosenfeld G9These make the machine act as if you had booted with BASIC OFF or ON, respectively. You can execute the DOS "B" command (or }DOS-XL "CART" command) after running BASICON but not after running BASICOFF. ively. You can execute the DOS "B" command (or ML&! &ՐeԐԥ`ԅ*ե` BHI Vl} ` BHI  Vl ` B Vl ` إ˥ = l 8       )H}   h`B Vl "`   DEIH  ؐl  ِl ` g  g-  }l  g  g g  g  ԭ 8 ԥeԅԐբPԝH՝I DEB Vl L }P B V` ` B V )I `J KBL0S:-DEIH Vl ``B Vl ``B V }l `Fatal Error #     EvDIH B Vl ԭթ      }  LPush key to return to DOSDEIH  5l HHHҩҍ2ҩ ҩ<   }ҍ2ҩҭhhh(`  ˑ     hh-H(ж`טH}ֱˑh`H       Hhh-H(мh`ȱȌ`IMEOL} CONVERTER v. 1.0by Michael Bailey1/17/90Convert ATASCII to ASCIIConvert ASCII to ATASCIIInsert proper disk(s)Press }Πto start  DEIH DEIH DEIH    N} N! Q N! m N$ TIQDEIH IDEIH LѝD}EIH mDEIH   DEIH DEIH  gJ  J}K[ BQDEIH Vl  JKBmDEIH Vl ;  IL  gMM } gMMM  L gMMɛ   MM  L   B V B Vl L  gMM g EOL CONVERTER v. 1.0 by Michael Bailey 1-17-90 I can hear everybody saying, "What? A!}nother EOL changer? There's only about a dozen around already!" Well, this one is machine language instead of BAS!}IC, and also uses the command line instead of having to answer prompts. I've tried it with SpartaDOS 2.3, 3.2, SDX, !} OS/A+, and DOS XL with no problems. The program reads a single byte then writes it back to the destina!}tion file instead of buffering a larger chunk of data all at once. Believe it or not, if you are converting ramdisk to !}ramdisk, single byte IO seems to be faster then buffered IO, but if you must use floppies, it will take longer. !} CONV.COM useage: CONV source dest. mode Source is the file to be converted. De!}st. is the name for the new file, and mode is the conversion method, either 'T' for aTascii to ascii, or 'S' for aS!}cii to atascii. Filespecs can be up to 28 characters including device spec., pathname, filename, and ext!}ension. This limit is the Sparta DOS routine COMFNAM's maximum, and isn't imposed by me. Any filespec. that is co!}mmand line legal is acceptable. Enjoy, Michael Bailey 1-18-90 ! } ailey 1-18-90 F0U11LLlL{L&LLLQL#L'L(LLL)L*L+L@L%"}¯LLLL,L-L.L/L1L2LL3乣L4L5LLLL6L7LL8L9L:L;LL?L@LALBLCLDLELFLGLHLILJ%#}LKLLLMLNLOLPLELQLRLSLTLULVLWLXLLYLZL[L0L]L^L_L`LaL7L-LgLLELbLcLdLeLfJp`B@%$}B$A:)nnovators  0#0 -!"/3    @ `F%%}iGiii$i%i// / @/  01/`01`ppp%&}B@A ``````````````````````````````````````````````````````````````````` L L ` %'}0`LLL`* ` `H șz?īLĮȌl l~}0爌l lLĮ z?l lɛL%(}īLîȩz? h` ` 7 `ijk` -"  q q g`ijk`` `%)}LKMNO BLV䮸LMN%B V ұ` 믮DEJKB V ұ` *L&B V%*}p ұLMNp` 믮BJKDE V ұ` 믩JKBDE Vp ұp`}轑}%+}`} F}`lj;k+*opui-=vcbxz436521, nm/reytwq907~8<>fhdgsaLJ:K\^OPUI_|VCBXZ$#&%"![ NM%,}?REYTWQ()'@}FHDGSA {    } ~ 깠Y)Щ t`%-}Щ t~` l 깠YNɛ) }ɛ ){a ` `Щ t l`p -?Щ t g w gp%.}`Hit Any Key -->@@No@@Yes@@|Internal I/O ERROR | @|à| @ Cont%/}ents TRUE ARC'D Method @ Stored @ Packed @ Squeezed @ Crunched @ Alfcrunch@ Unknown@ Squashed@%0}` - * g V - + g``BU6` * @xyzt?uB V0, +z?+iЩ tWЩ%1} t w CL+{?z? - g - g? n?ԭ? ? n?ԭ? {?Щ tLI%2}Щ tLIЩ tLIЩ tLIЩ tLI ׅЩ tLIͅЩ t * m?m?%3}m? Lԩ ٢ L f ؠ) - g( - g`H0 - gh8Ȫd 0 - g%4}8Ȫ 0 - g 0 - g`ԍՍ֍ nԭ ` ؠ) - g(`@@L@@gFR%5}iD,jDsԩD CDԩD CDO z? /dD C LYD ` 8 5 ԩF CԩE CDO z?:ԩE CD %6} L@eD 2dD CLYD 5DԩF CNԩE CD ԩF CDdԩE CDDԩF CDeD oԩE CDԩE CD fDA8%7}B4C0ԩE CDLgFoDpD`hrkDlD` &A A@ C AoDpD arD L B L4BLAɛL[B` f%8}DA DLB LA{LAɠLALAfDA DLB| DLBLAfDA DLB DLBfDA DLB8rD逍rD DLBfDAL%9}BB/~rD DLBfDALBBɛLBrD DLB DLBfDA rD DLBB rD DLB DLBfDAB DLB rD D %:}rD DLBoDgDLCApDhDLCAqDɈqDHH BL=ADF 2kDmDlDnD0 BiDrEmDHnDI VdD CLYD 5qD%;}ɉ` A@ԩF CDDԩF CD A@hhhhLdD`Ɉ qD`` 5 ԩE CDdD  A@dDɪɂɣ#ɥ-L.C̅ԩD CDL.Cمԩ%<}D CDL.CԩD CDL.CԩD CDL.Cȹz?ɛȩ@` F /dD CLWD ;iDmDjDnD0BhDFEmDHnDI V%=}dD CLWD0HgDIhD 8 5`kDlDrD LWDkDiD`lDjD` B &A`@ `hh 5 L%>}} ~|OASIS PAL Line Converter O8/24/88|@Aborted ... @Enter Read Filename With D: @Bad Name ! @Bad Device ! @%?}Bad WildCard!@Filename Error !@@Enter Filename To Copy To With D: @Append ? [Y/N] -> @My Job :Copy From:@C%@}opy To:@@ Choose One Job Strip [CR] To ATARI To ASCII Quits%A} Your Choice-->>>@ CANCELLED !!! @Saved To @D?:????????>????????>????????.???@D?:????????>????????>??????%B}??.???@hrhrii>@ CANCELLED !!! @Saved To @D?:????????>????????>????????.???@D?:????????>????????>??????$uTSTEHEXATOKENTOKEAAA ` ( @ AC )D}AMAC/65 TOKEN CONVERTER(C) 1987 ANALOG COMPUTING WRITTEN BY CHARLES BACHAND&&9AU,9AU)E},9@,;@@,;A,$ Ap A`.G Ap(4(RETURN for directory or name ofG( )F}ï file8"4 A@" ApB @@L)@)@V"AT*")G}A0`%(Not a MAC/65 File!% Apj)@)@t-(-(File length = %$AV%@~G )H}AP(4(RETURN for directory or name ofG( Ԡ file"4 A@" AP @@)I}PROCESS A LINE A@*)@)@*)@-6-&@- @%)J}$AV 2)@6-&@2@Ap+-@)@+*@  @)K} A  A(A -A))@ "*@6-&@" $"(@$ )L}A )@6-&@($$(@ 78,<8,, 2"AP<$"(@$ )M}A F)@6-&@PY!A(6-#-A)0)@=*@K6-&@O Y A@)N}ZY"@)@))@A(@%$AVO6-&@Y A@dB"@)@*(@)O}86-&@B A@ng,(@78%A(,<8%A(,,8"@E)@O A]6-&@)P}g A@x["@)@))@76-&@A AG6-Q A[ A@P"@Y-@)Q}*)@7*@; F(@P A 7"@)@)*@76-&@ A@)R}&6-F:A,&"A6Ap?<(ERROR # AT LINE F:A,%F:A,$AV?&SET-UP TOKEN T)S}ABLES#(#(ï TOKEN CONVERTER!(!(Initializing arrays, "(please wait..."6-@* ")T}6@ A* A "6-A6.,X" A"6-A6.,Y" A!6-@6. ! )U}A!6-A6.,! A"(6-A6.>:@4,( A,#6-A6.,X)# A66-A)V}6.),Y@ 68,-67,.J68,-B:,T6-B:,%@$^hHEX CONVERSIONr|-@)W}"68,-@:, $$6-P:'@,$6-&$@#*@8,#*@8,$READ DI)X}SK DIRECTORY0&@@D:*.*0 AU@( AP@$)Y}TOKEN TABLE!!79,ADC,77,AND,84,ASL,68,BCC!!69,BCS,70,BEQ,71,BMI,72,BNE!!73,BPL,74,BVC,75,BVS,42,BIT!!43,)Z}BRK,44,CLC,45,CLD,46,CLI&!!47,CLV,82,CMP,40,CPX,41,CPY0!!34,DEC,48,DEX,49,DEY,78,EOR:!!35,INC,50,INX,51,INY,33,JMPD)[}!!32,JSR,81,LDA,36,LDX,37,LDYN!!86,LSR,52,NOP,76,ORA,53,PHAX!!54,PHP,55,PLA,56,PLP,85,ROLb!!87,ROR,83,SBC,59,SEC,6)\}0,SEDl!!61,SEI,80,STA,38,STX,39,STYv!!62,TAX,63,TAY,64,TSX,65,TXA!!66,TXS,67,TYA,57,RTI,58,RTS!!21,BRA,90,DEA,9)]}1,INA,92,PHX!!93,PHY,94,PLX,95,PLY,89,STZ22,TRB,23,TSB,29,*=14,.END,26,;,19,.ORG,30,= 20,.EQU,11,.BYTE,1)^}2,.SBYTE!!25,.CBYTE,13,.DBYTE,9,.WORD18,.DS,2,.ELSE,3,.ENDIF10,.ERROR,24,.FLOAT!!1,.IF,17,.INCLUDE,27,.LO)_}CAL15,.OPT,8,.PAGE,28,.SET!!0,ERROR - ,4,.MACRO,5,.ENDM6,.TITLE,31,.=,16,.TAB190,#,187, ,134,$,133,$ )`}180, <,181, >,138,',159,[160,],146,+,149,/,148,* 167,\,150,&,164,!,165,^*152,=,156,>,157,<,158,-4 147,)a}-,155,<>,154,>=,153,<=>179, .OR ,197,NO ,201HLIST,178, .AND ,199RERR,177, .NOT ,200\EJECT,176, .DEF ,198)b}fOBJ,175, .REF ,203,MLISTp 204,CLIST,205,NUM,202,XREFz192,(,186,),139,%$,141,*191,A,140,%,-1,XXX0,1,)c}2,3,4,5,6,7,8,9A,B,C,D,E,FD2:DETOKEN.BAS191,A,140,%,-1,XXX0,1,(`Date: 8 Mar 91 02:56:25 GMT From: arizona.edu!cerritos.edu!nic.csu.net!usc!zaphod.mps.ohio-state.edu!magnus.ircc.ohio-state.e-e}du!news@arizona.edu (Frank E. Seipel) Subject: DETOKENIZE MAC/65 To: Info-Atari8@naucse.cse.nau.edu This one is a BASIC pro-f}gram to turn Mac/65 source code into ASCII text. It is mostly of use to those who never purchased Mac/65 but have other assem-g}blers, such as SynAssembler and Atari's Macro Assembler. Uuencoded. RUN at READY prompt. urchased Mac/65 but have other assem,Y,B%DOS SYSB*)DUP SYSBSARGSOS3 128B+ARGSOS3 DOCBBASICOFFCOMBBASICON COMBBASICON TXTBCONV COMB CONV DOCB"!CR COMB!CDETM65 BASBdDETM65 TXTBqDONBACK COMB#DONBACK DOCBIRAMDISK2AS BRELOC TXTBRELOCATEBASB9 RENUMBERASMB.FRENUMBERBASB0tRENUMBERDOCplw&DONBACK v1.1 (c)1991 By Donald LimmerthihiHHȱȱ`p B V8l Tp Vhh1r}lhpHHJJJJhh`hhlhp `iDiE`ԆՄ ؠ0ȑ8)ȑ`0LpII襢 piȑ1s}ȩ-`ȩ$&*i0:iȑ`jp LFĆ>%>Ć5%/E1t})ԵH膇hCI4H*.* D7:DIR1.BAK /RUsing this syntax, you are telling DONBACK to restore a subdirectory ondrive 35} called "SUB" using the datafrom the file "DIR1.BAK" which resides on drive 7.: The DONBACK v1.1 program5} : Destination directory to restore (including wild- cards)Ͳ : Source filename to use for 5} the RESTORE operationͳ : /R tells DONBACK to use the RESTORE operationThe third parameter MUST be use5}d or DONBACK will simply drop you backinto SpartaDOS. A note will alsoremind you that you need a parameter.The only stri5}cture to DONBACK is thatthe command line may not contain anymore than 64 characters in total! This, however, is the only 5}limit. * * 5}PLEASE BE SURE TO HAVE BACK-UP'S OFYOUR FILES BEFORE USING DONBACK!!!I have been testing DONBACK in manydifferent situat5}ions and I have foundthat an error 135 (FILE/IOCB Not OpenFor Write) will occasionally pop-up!This usually happens when yo5}ur directory decides not to allocate files properly. This is not a bug inDONBACK but simply a "screw-up" thathappens whe5}n a directory is over-written. Once you have used DONBACKto restore a directory DO NOT WRITEANYMORE FILES on the restored5} disk.DONBACK is simply a tool to help thesevere anxiety of a disk crash. It will restore your directory so thatyou can 5}copy the remainder of the files onto a back-up disk. Once youhave finished, either reformat the disk or rewrite the direc5}tory. Andjust for moral support, DONBACK is safe when used as intended. Do notuse DONBACK as a replacement forICD's UNE5}RASE.COM (which comes withthe SpartaDOS construction set).Summary of DONBACK: r5}eplaces BACKDIR & REPDIR use in conjunction with other file back-up utilities use as a directory backup/ 5}restore utility do not use to UNERASE files! make back-up's of important files before using DONBACK once 5}a directory is restored, back-up remaining files then reformat or rewrite directoryWell, I hope I have covered a5}lmosteverything. My thanks to Dave Hallin Winnipeg, MB for the originalBASIC code. This is what inspiredme to reprogram5} a directory backup/restore utility in ACTION!I guess my final words will be "Usecarefully and enjoy the new DONBACKv1.15}"!Donald Limmert306-426 Pemberton TerraceKamloops, BC, CanadaV2B-2V9Ph.# (604)372-1094and enjoy the new DONBACKv1.14_; Ramdisk Controller for 256k atari 800xl ; by Claus Buchholz, Dec. ,1984 ; ; ; ; This assembly language program provides a R9}AM-DISK for the ; 256k Atari 800XL described in the September issue of BYTE ; ; ; OPTIONS: Drive # and density ; DRIVE = 9}2 DENSITY= SINGLE ; ; ; Equates ; SINGLE = $80 SECTOR LENGTHS DOUBLE = $00 DDEVIC = $300 SIO DEVICE9} CONTROL BLOCK DUNIT = $301 DCOMND = $302 DSTATS = $303 DBUFLO = $304 DBYTLO = $308 DAUX1 = $30A DOSINI =9} $0C Acess to RESET initialization CHKSUM = $31 Temporary checksum BUFRLO = $32 Temporary point9}er to user's buffer ZTEMP = $34 Temporary miscellaneous use STACKP = $318 Stack pointer save PORTB = 9}$D301 PIA port B - memory control register ; ; Load-time code - Copy OS into RAM ; *= $3000 GO LDA PORT9}B Enable OS ROM ORA #1 STA PORT LDA #$CO Zero page pointer STA $CC LDA #0 9} STA $CB SEI Disable Interrupts STA $D40E TAY LOOP LDA ($CB),Y Copy OS 9} DEC PORTB Enable RAM STA ($CB),Y INC PORTB Enable ROM INY BNE LOOP LDX 9} $CC CPX #$CB Skip pages $CC to $D7 BNE NXPG LDX #$D7 NXPG INX STX $CC BN9}E LOOP DEC PORTB Enable RAM LDA #$40 Enable Interrupts STA $D40E CLI RTS 9} Continue Load *= $2E2 .WORD GO Execute preliminary load-time code ; ; Ramdisk Controller Co9}de ; *= $CC00 Permanet Code - in place of alt. char. set HOOK CLC Hook into all SIO calls 9} LDA DDEVIC ADC DUNIT CMP #$31+DRIVE Right drive Number ? BEQ HOOKED OLDVEC = *+1 JMP 9} * If not, goto SIO HOOKED TSX If so, intercept STX STACKP Save Stack Pointer 9}LDA DCOMND Examine Command CMP #'! Format ? BNE NOFMT JMP FORMAT NOFMT CMP #'P 9} Put Sector ? BNE NOPUT JMP PUTSEC NOPUT CMP #'R Read Sector ? BNE NOGET JMP 9} GETSEC NOGET CMP #'S Read Status ? BNE NOSTT JMP STATUS NOSTT CMP #'W Write Sect9}or ? BNE NAKRET JMP PUTSEC ; ; Returms - Restore Stack Pointer, report error status and return ; NAKRET 9} LDX STACKP TXS LDY #139 NAK error for improper command STY DSTATS RTS ERRRET LDX9} STACKP TXS LDY #144 Bad sector error STY DSTATS RTS SUCRET LDX STACKP TXS9} LDY #1 No error STY DSTATS RTS ; ; Subroutine - set pointer to user buffer ; SETBUF LDS9} DBUFLO Move from DCB to zero page STA BUFRLO LDA DBUFLO+1 STA BUFRLO+1 RTS ; ; Subroutine 9}- Prepare to access sector of ramdisk ; SETSEC LDA #DENSITY STA SECLEN Set sector length LDA DAUX19}+1 Check sector # BNE NOTZ LDA DAUX1 BEQ OUTRG Sector 0 invalid CMP #4 BCS INRN9}G LDA #$80 Sectors 1-3 are always 128 bytes long STA SECLEN BNE INRNG OUTRG JMP NAKRET9} Sector # out of range NOTZ CMP #2 Check for sector # > $2D0 BCC INRNG BNE OUTRG LDA9} #$D0 CMP DAUX1 BCC OUTRG INRNG LDA DAUX1 Sector # valid LDY DAUX1+1 LDX #$FF DI9}V121 INX Divide # 121 - Result is bank #, remainder is page # SEC SBC #121 BCS NOBOR9} DEY NOBOR CPY #$FF BNE DIVI121 AND #$7F Remainder+7 ; ; Subroutine - Prepare to switch b9}anks: ; SETBNK STA ZP Save page # LDA PORTB STA PBN Normal bank AND #$8F 9} STA PB Bank 0 TXA ASL A ASL A ASL A ASL A ORA PB STA PB 9} Bank X LDA $FFFA NMI vector STA ZTEMP LDA $FFFB STA ZTEMP+1 LDY #0 LDA 9}#$40 RTI opcode SEI Disable IRQ STA (ZTEMP),Y Place RTI in NMI routine - disables NMI L9}DA PB STA PORTB Switch bank In TYA STA 0 Set up Zero-page pointer LDA ZP S9}TA 1 LDA PBN STA PORTB Switch normal bank back in RTS Leave 0 in Y, bank # in X ; ; Fo9}rmat Routine ; FORMAT LDX #5 CLEAR BANKS 0 TO 5 CLOOP1 LDA #2 CLEAR PAGE 2 AND UP JSR S9}ETBNK PREPARE FOR SWITCH LDA PB STA PORTB SWITCH BANK IN TYA CLOOP2 STA (0),Y ZERO9} ENTIRE PAGE INY BNE CLOOP2 INC 1 NEXT PAGE BPL CLOOP2 LDA PBN STA POR9}TB SWITCH BANK OUT LDA NMI STA (ZTEMP),Y ENABLE INTERRUPTS CLI DEX NEXT BANK 9} BPL CLOOP1 JSR SETBUF LDA #$FF RETURN A SECTOR WITH 2 $FF AND THE REST 0 LDY #0 FLOOP 9} CPY #2 BNE NOTFF LDA #0 NOTFF STA (BUFRLO),Y INY CPY SECLEN BNE FLOOP 9} JMP SUCRET Done ; ; Write sector routine ; PUTSEC JSR SETBUF LDA #0 STA CHKSUM ZERO CHECK9}SUM JSR SETSEC POINT TO RAMDISK SECTOR PLOOP LDA (BUFRLO),Y GET BYTE FROM USERS BUFFER LDX PB 9} STX PORTB STA (0),Y PUT BYTE INTO RAMDISK LDX PBN STX PORTB NORMAL BANK CLC 9} ADC CHKSUM ADD BYTE TO CHECKSUM STA CHKSUM INY NEXT BYTE CPY SECLEN PROPER SE9}CTOR LENGTH BNE PLOOP LDX #0 BANK 0 HOLDS CHECKSUM TABLE LDA DAUX1+1 CLC ADC #9}2 SECTOR # INDEXES CHECKSUM TABLE JSR SETBNK LDY DAUX1 LDA CHKSUM LDX PB STX 9}PORTB SWITCH BANK STA (0),Y STORE CHECKSUM LDX PBN STX PORTB NORMAL BANK LDY #9}0 LDA MNI STA (ZTEMP),Y ENABLE INTERRUPTS CLI JMP SUCRET DONE ; ; READ SECTOR ROUTINE ; 9}GETSEC JSR SETBUF LDA #0 STA CHKSUM ZERO CHECKSUM JSR SETSEC GLOOP LDX PB 9}STX PORTB SWITCH BANK LDA (0),Y GET BYTE FROM RAMDISK LDX PBN STX PORTB NORMAL BANK 9} STA (BUFRLO),Y PUT BYTE INTO USERS BUFFER CLC ADC CHKSUM ADD TO CHECKSUM STA CHKSUM 9}INY NEXT BYTE CPY SECLEN PROPER SECTOR LENGTH BNE GLOOP LDX #0 BANK 0 FOR CHE9}CKSUM TABLE LDA DAUX1+1 CLC ADC #2 JSR SETBNK LDY DAUX1 LDX PB STX POR9}TB SWITCH BANK LDA (0),Y GET ORIGNIAL CHECKSUM LDX PBN STX PORTB NORMAL BANK TA9}X LDY #0 LDA NMI STA (ZTEMP),Y ENABLE INTERRUPTS CLI CPX CHKSUM COMPARE CHECKSUMS9} BEQ GCSOK JMP ERRRET IF DIFFERENT, BAD SECTOR GCSOK JMP SUCRET IF SAME, DONE ; ; READ STATUS9} ROUTINE ; STATUS JSR SETBUF LDY #4 RETURN 4 BYTES LDA #0 ALL ZEROS SLOOP DEY 9} BEQ STEND STA (BUFRLO),Y JMP SLOOP STEND FLAG = DENSITY/4 LDA #$20-FLAG STA (BUF9}RLO),Y FIRST BYTE TELLS DENSITY OF DRIVE JMP SUCRET DONE ; ; VARIABLE STORAGBE AREA ; ZP *= *+1 HOLD9}S PAGE # IN RAMDISK TO BE ACCESSED PB *= *+1 VALUE OF MEMORY CONTROL REGISTER FOR SELECTED BANK PBN *= *+1 9} VALUE OF MEMORY CONTROL REGISTER FOR NORMAL BANK NMI *= *+1 FIRST OPCODE IN NMI ROUTINE - USED TO RESTORE 9}NMI SECLEN *= *+1 LENGTH OF CURRENT SECTOR ; ; RESET INITIALIZATION ROUTINE ; *= $100 HIDDEN (HOPEFU9}LLY !) NEWINI DEC PORTB ENABLE RAM OS OLDINI = *+1 JSR * CALL ORIGINAL DOSINI ROUTINE MODIN9}I LDA #NEWINI$&FF set hook for next reset STA DOSINI LDA #NEWINI/$100 STA DOSINI+1 RTS9} ; ; LOAD-TIME CODE - INSTALL RAMDISK ; *= $3000 DO LDA $E45A SAVE ORIGNIAL SIO VECTOR STA OLDV9}EC LDA $E45B STA OLDVEC+1 LDA #HOOK&$FF INSTALL NEW SIO VECTOR STA $E45A LDA #HOOK/$9}100 STA $E45B LDA $FFFA SAVE FIRST OPCODE IN NMI ROUTINE STA $CB LDA $FFFB STA $9}CC LDY #0 LDA ($CB),Y STA NMI LDA DOSINI SAVE ORIGINAL DOSINI VECTOR STA OLDINI 9} LDA DOSINI+1 STA DOSINI+1 JSR MODINI INSTALL NEW ONE JSR $7E0 RE-INITIALIZE FMS TO SHOW9} RAMDISK PRESENT RTS DONE *= $2E2 .WORD DO EXECUTE FINAL LOAD-TIME CODE E FMS TO SHOW8pDate: 2 Mar 91 04:57:40 GMT From: noao!ncar!csn!magnus.ircc.ohio-state.edu!news@arizona.edu (Frank E. Seipel) Subject: Basic =}Relocator (Line Renumbering) To: Info-Atari8@naucse.cse.nau.edu Here is the description of my line renumbering program, fro=}m the A.C.E.C. BBS @ (614)-471-8559: 26/2/89 C45:Relocatr Written by yours truly. Program to relocate a BASIC LISTed file.=} Will renumber the file. User inputs starting line of new file, line increment. All GOSUB/GOTO/RESTORE/TRAP/ON GOSUB/ON GOTO =}statements are adjusted so that the new listing runs as-is. Also works with assembly language files. Handy for making listing=}s for readable and creating space for modifications in a crowded program. Also useful for putting together two subroutines wh=}ich previously existed in the same range of lines. Writes out another listed file; use ENTER to load output file. -Fr=}ank Seipel ly existed in the same range of lines. Writes out another listed file; use ENTER to load output file. -Fr< MN1 @ SOURCEDESTLNTEMPTSTLINESASSTARLINTOTLINELCTESLNULNGLINE(,T,A}A A@ @W @ @ @@2@A @@A}@dQ+Q;@ ,;@ ,;A,;A,;@,9A%,nQ   àA}70@Q0@@x* *  Written by Frank Seipel[  0 "Filenames must incA}lude device nameX #(i.e., D: should precede filenames)[ <(  Enter source file (.LST or .ASM)/(><@D A}0 %Enter destination file (.LST or .ASM)7(>D@P 0 %Is the source file assembly language?C((YES or NO)A} >P@K6-?7@<@,4Y)7@<@,4yK6-@= ) Enter new starting lineA} number0 >=@7 # Enter new line increment* >7@*A*@@A}AP6-@%68%@,-A:,%6-%@ A  @ AR@, @A}@,6-7 @@*A 7 >:A%,;@6-%@;67BA}:,%@,.>:AU,"L-@@3 Currently processing lineE-@@L A:,, A66-B}@$6-%@$6.7<%@,J%4GOTO 6-@% AT%4GOSUB6-@% A^Y4B}THEN -6-@:7%@<%@,,C!@G* @XO6-@Y Ah%4TRAP 6-@% Ar%4B}RESTO6-@% A|$7<%@,4ON $ A  B:,&@ A 6-@ A.$B} @%$+&@,7,. A-B:,&@;7<%@,4 GOTO +6-%@16-; A`B};7<%@,4 GOSUB+6-%@16-; A`  A6- A<6-%B:=:,,7<,4B},,6-%@26-< A` 6- AE & Error in opening data filesB check filename(s)/typesEB}6-M6-@:7<,,'!@G* @X56-%@C6-%@M A$6-6-%@B}&# 8," 6-%$+&@,#$0   A@: D=' Makes reference to non-existant:  line number =NB}1 6-%6- A'6-A:7,,1 A0X[6.7@<&@,367B:,%@,.=:,J67B:,%@,.7,P6B }.X6-%[$b A Al^(>:A%,"AR7F:A,"A6: [ File converted successfullyB }.^vMM  ERROR- F:A, at line number F:A,%F:A,$AV2 * occurred proccessing this line:-B } 2 S , !Fix bad line number expression orS "data, reLIST file, and then re-run this program. D:B }RELOCata, reLIST file, and then re-run this program. D:@8*dX;INSTANT RENUMBERnX;by A. GiambraxX;aX;X;OS EQUATESX;FPA;;FP TO ASCIIFPI;;FP TO INF}TEGERIFP;;INTEGER TO FP INBUFFX;X;WORK AREASX; PRINTX;!X;NOTE: BASIC WILL LOOK UP THEX;EF}DITOR PUTBYTE ADDRESS ANDX;FILL THIS IN FOR US"X;,POINTER6 INDEX@ EOPJLINELOWT LINEHI^LINEF}OFFSEThSTATEOFFSETrCURLINE|LINENO1ԆLINENO2ՐLINENO3֚LINENO4פLINENO5خLINENO6F} FROREFLINELOREFLINEHIFUTLINE SINDEX TEMP1 TEMP2 TEMP3 TEMP4 SAVEF}Y FLAG& BASE0 INCR: ERRD ERROR@N SPACE XX;b7lR>;;CORRECT NO.vFGOODPARAMS;;OF PARAF}METERS?> FRINGBELL ERRLOOP 7;;ERROR7;;WRONG PARAMETERS0 HERRLOOP RINGBELLQ>;;BELL RINGER PRINF}TQ>;;RETURN AN ERRORPERR !ERRORGOODPARAMS 7;;THROW AWAY HIGH BYTEPBASE;;STORE BASE 7* PBASE47>F}7;;THROW AWAY HIGH BYTEHPINCR;;STORE INCREMENTRQPOINTER;;BASIC'S POINTER\PINDEX;;TO PROGRAM CODEfQPOINTERp F}PINDEXz QBASEPCURLINE;;SAVE BASE HERE QBASEPCURLINE%>LOOPQ@INDEX7;;GET LINENOPLINELOW;;SF}TORE IT3Q@INDEX7;;LOAD HI BYTE PLINEHI; QINDEXSEOPQINDEX;;HAVE WE REACHEDSEOP;;END OF PROG?F}FRESEQA;:THEN GO RESEQ3$ Q@INDEX7. PLINEOFFSET;;GET LINE OFFSET83BNXTSTATEMENTQ@INDEX7L&PSTATEOFFSET;;GET F}STATEMENT OFFSETV3` CHECKTOKENjQSTATEOFFSETtRLINEOFFSET;;END OF LINE?~HNEXTSTATEMENTQINDEX;;INCREMENT INDEXF},;;BY OFFSETOLINEOFFSET PINDEX QINDEXO> PINDEX QCURLINE, OINCRPCURLINE;;INCREMENT LINF}E NODNX2#CURLINE NX2%>;;RESET INDEX FLOOP(NEXTSTATEMENT%STATEOFFSET2Q><FNXTSTATEMENTFRESEF}QAQ>P FRESEQBZCHECKTOKENd Q@INDEX7nR> xFGOTO;;CHECK THE TOKENR> ;;IS IT ONE WE WANT? FGOTOR> ;;IS IF}T A GOSUB FGOTOR> ;;OR A TRAP STATEMENT FGOTOR>#;;OR A RESTORE FGOTOR>;;ON GOTO FONGOSUBAR>;;IFF} STATEMENT FONGOTOA:X;#X;THE FOLLOWING 'BUCKET BRIGADE'X;MAKE THE RENUMBER UTILITY"X;RELOCATABLE,X;6ONGOF}SUBAFONGOSUBB@ONGOTOAFONGOTOBJRESEQBFRESEQCT GOTO3^ENTRYQ@INDEX7hR>;;END OF 1ST STATEMENT?r FGOBACK|R>F };;END OF LINE? FGOBACKR>;;DOES A NUMBER FOLLOW? HPRINTSR3 'SAVEYQ@INDEX7;;THIS IS A GOTOPLINENO1;;F!}REFERENCE SO3;;GET LINE NUMBER Q@INDEX7 PLINENO23 Q@INDEX7 PLINENO33 Q@INDEX7 PLINENO4&101:1F"}D CONVERTIT;;CONVERT BCD LINENQREFLINELO;;GET LINE NO?X;b%SLINELOW;;SUBTRACT CURRENT LINENOl QLINEHIvFCHECKFLAF#}GQREFLINEHIESBCA;;IS REFERENCED LINE;;;AT TOP OF PROGRAMS>;;OR BOTTOM?DTOPSEARCHSBCASLINEHI&CHECKF$}FLAGDTOPSEARCH;;START AT TOPEENDSEARCH;;START FROM HEREONGOSUBBFONGOSUBCONGOTOBFONGOTOCENTRYFDENTRYREF%}SEQCFRESEQD GOBACK3:  PRINTSRQ>S;;PRINT SR MESSAGE  PRINT*Q>R4 PRINT>Q>SPACE;;PRINT A SPACEH PRINF&}TR PRINTLINENO\QSAVEY;;RESTORE Yf?p3z:TOPSEARCHQPOINTERPSINDEX;;POINT TO BOPQPOINTERPSINDEXF'}QBASE;;GET BASE LINE NOPFUTLINE;;STORE IT QBASEPFUTLINEQ> FSEARCHRESEQDFRESEQEONGOSUBCF(}FONGOSUBDONGOTOCFONGOTOD ENTRYEDENTRYF #ENDSEARCHQINDEX;;SET SINDEX TO PSINDEX;;CURRENT POSITION$ QINDEXF)}. PSINDEX8 QCURLINE;;SET FUTURE LINENOB PFUTLINE;;TO CURRENT LINE NOL QCURLINEV PFUTLINE` SEARCHj QSINF*}DEX;;LOOK FOR REFERENCEDt ;;;LINE NUMBER~ SEOP;;END OF PROGRAM? 3 QSINDEX SEOP FNOTFOUND;;YEP! %> QF+}REFLINELO;;GET REF LINE ; S@SINDEX7;;ARE WE THERE? PTEMP1 3 QREFLINEHI ESBC2 ; S> DNOTFOUND;;COULDNF,}'T FIND IT SBC2S@SINDEX7( PTEMP22 DNOTFOUND< QTEMP1;;IS IT A MATCH?F R>P HCONTINUEZ QTEMP2d R>n FFOUNDIF-}TAx #CONTINUEQFUTLINE;;KEEP LOOKING , OINCR;;INCREMENT FUTURE LINE PFUTLINE D@FAHEAD #FUTLINE @FAHEAD F.}QSINDEX;;POINT SINDEX TO ,;;NEXT LINE %> O@SINDEX7 PSINDEX;;ADD OFFSET D@CONT #SINDEX @CONT Q>F/} FSEARCH" FOUNDITAQ>, FFOUNDIT6 RESEQEFRESEQF@ ONGOSUBDFONGOSUBEJ ONGOTODFONGOTOET ENTRYDDENTRYE^ NOTFOF0}UNDh Q>N;;LOAD 'N'r PRINT| Q>F;;LOAD 'F' PRINT Q>SPACE;;LOAD A SPACE PRINT PRINTLINENO Q> PFLAG;;F1}SET FLAG QCURLINE PFUTLINE;;SET FUTURE LINE QCURLINE PFUTLINE  CONVERTBACK  FPA;;CONVERT TO A STRINGF2} %> LPX 'TEMP1 Q@INBUFF7;;PRINT THE STRING& ILPX1;;NOT LAST CHARACTER0 M>;;TURN OFF HIGH BIT: PRINTD Q>F3}SPACE;;LOAD A SPACEN HENDNFX LPX1b PRINTl %TEMP1v 3 HLPX ENDNF PRINT QSAVEY;;RESTORE Y ? 3 3 3F4} 3 3 3 : RESEQFFRESEQG ONGOSUBEFONGOSUB ONGOTOEFONGOTO ENTRYCDENTRYD +FOUNDIT CONVERTBACK;;FOUND LF5}INE NUMBER* QSAVEY4 ?> 3H 3R 3\ 3f 3p 3z : ONGOSUB3;;IS THIS ON GOSUB? Q@INDEX7 R> %FTAKEOFF;;IF YES, TF6}HEN PROCESS IT R> FTAKEOFF R>;;DOES A NUMBER FOLLOW? HLOOPAGAIN C , O>;;BUMP Y UP BY 6 ? LOOPAGAINF7}Q> FONGOSUB TAKEOFF3 ENTRY$Q@INDEX7;;GET TOKEN.R>;;END OF STATEMENT8 FGETOUTBR>;;END OF LINEL FGETF8}OUTV HTAKEOFF`RESEQGFRESEQHj GETOUT:t ONGOTO~3;;IS IT ONGOTO Q@INDEX7R> FCHECKITR>;;DOES NUMBER FF9}OLLOW? HAHEADC,O>;;BUMP Y BY 6? AHEADQ>#FONGOTO;;IT'S AN ONGOTO COMMAND CHECKIT3C #RSTATEOFFF:}SET;;END OF STATEMENT?EOUTDENTRYC;;FOUND ON GOSUB(OUT:2 CONVERTIT< Q>;;COVERTS BCD LINE TO HEXFPLINENO5;;CF;}LEAR 5 AND 6P PLINENO6Z FPI;;FP TO INTEGERdQFRO;;GET THE INTEGERnPREFLINELO;;STORE ITx QFROPREFLINEHI:F<}RESEQHFRESEQCONVERTBACK QFUTLINEPFROQFUTLINE PFRO! IFP;;CONVERT HEX LINE TO BCDQFLAG;;CHEF=}CK FLAGR>;;IS IT TURNED ON? FRETURNQSAVEY;;RESTORE Y?QLINENO1;;STUFF LINE NUMBERP@INDEX7;;INTO BASIC CF>}ODE"3, QLINENO26 P@INDEX7@3J QLINENO3T P@INDEX7^3h QLINENO4r P@INDEX7|333RETURNQ> PFLAGF?}: RESEQ!QPOINTER;;ALL LINE REFERENCESPINDEX;;TAKEN CARE OF+QPOINTER;;NOW RESEQUENCE THE PROGRAM PINDEXF@}QBASE;;GET BASE NUMBER PCURLINE QBASEPCURLINE SPINNER&QINDEX;;SPIN THROUGH UNTIL THE END&;0SEOPFA};;END OF PROGRAM?: QINDEXD SEOPNFENDITALL;;YES (WHEW)X%>bQ@INDEX7;;GET LINE OFFSETlPTEMP1;;SAVE ITv!QFB}CURLINE;;GET CURRENT LINE NO,%>P@INDEX7;;STORE ITQCURLINE3P@INDEX7;;STORE HI BYTE QCURLINEOFC}INCR;;INCREMENT IT PCURLINE D@NEXT#CURLINE @NEXT,QINDEX;;GO TO NEXT LINE  OTEMP1 PINDEX  D@NOCAFD}RRY* #INDEX4 @NOCARRY>Q>H FSPINNERR$ENDITALL:;;AT LONG LAST, THE END..........................................FE}........................................SPINNERR$ENDITALL:;;AT LONG LAST, THE END..........................................D(9:ADDADDRADADLOMEAMOUNHIMECOUNLHOFFSEINSTALJG} d ASSEMBLER RENUMBER UTILITYnBY ANGELO GIAJH}MBRAx##SINCE THE RENUMBER UTILITY IS""NOT FULLY RELOCATABLE, BASIC##LOOKS FOR THE JSR'S AND FIXESTHE AJI}DDRESSES(6-A(START OF HANDLER TABLE)>:F:,,0E6-%@) AN16-F:%@,%F:%@JJ},$AV%@NGET EDITOR PUTBYTE ADDRESSG)6-F:,%F:%@,$AV%@GCOPY EDITOR PUTBYTE ADDRESS$6JK}-P:'AV,$6-&$AVC%-F:AC,%F:AD,$AV7AYC6-BP*$6-+F:A,&@,JL}$AV*6--A"UA"@)"@)"A)"AG)"AR)"AWK AU A`JM}K7"A`)"A)"A)"A)"A(A AK A`K7"AD)"AQ)"AY)"A)"JN}AA AK A`"3 6-%@%6-%@) 3 A@, 6-%@""6/"*JO}"6-%6-/ A0@B6-%AV$6-&06-P:+%,'AV,B6-%&$AVJN 6-%@JP}+6-%@96-%@="K6-%@N$T 6- A6-^"h7#"A)"AB)"Ad- JQ}A@7 A`r/ 6-%@%6-%@/ AP|+%6-F:AC,%F:AD,$AV+(}V-@@JR},(RENUMBER INSTALLED>-@@V(AT DECIMAL ADDRESS +-@@(+-@#AYJS}@46-?:<<, 6-%@""@ 6-%@+6-%@96-%@="@$JT}WW104,201,2,240,20,170,240,5,104,104,202,208,251,169,253,32,0,0,169,3,133,185,76,64ee185,104,133,232,104,133,231,104,1JU}04,133,233,165,136,133,203,165,137,133,204,165,231,133,229,165bb232,133,230,160,0,177,203,133,205,200,177,203,133,206,56,JV}165,203,229,138,165,204,229,139,240__54,200,177,203,133,207,200,177,203,133,208,200,32,43,98,165,208,197,207,208,28,165,2JW}03,24^^101,207,133,203,165,204,105,0,133,204,165,229,24,101,233,133,229,144,2,230,230,160,0,240[[188,164,208,169,0,24JX}0,208,169,0,240,35,177,203,201,10,240,31,201,11,240,27,201,12,240UU23,201,13,240,19,201,35,240,15,201,30,240,5,201,7,240,JY}3,96,240,71,240,71,240,73__200,177,203,201,20,240,68,201,22,240,64,201,14,208,62,200,132,227,177,203,133,212,200,177bbJZ}203,133,213,200,177,203,133,214,200,177,203,133,215,136,136,136,32,221,99,165,235,56,229,205&ZZ165,206,240,11,165,236,176J[},5,56,233,1,144,39,229,206,144,35,176,61,240,53,240,53,1440NN184,240,45,200,96,169,83,32,0,0,169,82,32,0,0,169,32,32,0,0,3J\}2,72,99,165:aa227,168,200,96,165,136,133,220,165,137,133,221,165,231,133,218,165,232,133,219,169,0,240,24Dee240,103,240J]},103,240,103,144,199,165,203,133,220,165,204,133,221,165,229,133,218,165,230,133,219N``165,220,56,229,138,200,165,221,229,J^}139,240,77,160,0,165,235,56,241,220,133,223,200,165,236XXX176,5,56,233,1,144,58,241,220,133,224,144,52,165,223,201,0,208,6J_},165,224,201,0,240b\\28,165,218,24,101,233,133,218,144,2,230,219,165,220,24,160,2,113,220,133,220,144,2,230lVV221,169,0J`},240,179,169,0,240,87,240,77,240,77,240,77,144,149,169,78,32,0,0,169,70vUU32,0,0,169,32,32,0,0,169,1,133,228,165,229,133,2Ja}18,165,230,133,219,32,241,99,32RR230,216,160,0,132,223,177,243,16,9,41,127,32,0,0,169,32,208,8,32,0,0,164,223\\200,20Jb}8,233,32,0,0,165,227,168,200,200,200,200,200,200,96,240,59,240,17,240,58,144,175^^32,241,99,165,227,168,200,200,200,200,2Jc}00,200,96,200,177,203,201,23,240,17,201,24,240,13WW201,14,208,5,152,24,105,6,168,169,0,240,232,200,32,81,98,177,203,201,2Jd}0,240,8,201XX22,240,4,208,240,240,48,96,200,177,203,201,27,240,13,201,14,208,5,152,24,105,6,168]]169,0,240,236,200,15Je}2,197,208,176,2,144,170,96,169,0,133,216,133,217,32,210,217,165,212``133,235,165,213,133,236,96,240,47,165,218,133,212,16Jf}5,219,133,213,32,170,217,165,228,201,1dd240,25,165,227,168,165,212,145,203,200,165,213,145,203,200,165,214,145,203,200,16Jg}5,215,145,203bb200,200,200,169,0,133,228,96,165,136,133,203,165,137,133,204,165,231,133,229,165,232,133,230^^165,203,Jh}56,229,138,165,204,229,139,240,43,160,2,177,203,133,223,165,229,24,160,0,145,203``165,230,200,145,203,165,229,101,233,133Ji},229,144,2,230,230,24,165,203,101,223,133,203,144,2230,204,169,0,240,202,96YY169,0,133,8,133,2,165,9,240,8,169,116,Jj}133,10,169,228,133,11,104,104,133,208,104,133ZZ207,104,133,206,104,133,205,56,173,231,2,133,203,233,1,133,0,173,232,2,133Jk},204,233,0 YY133,1,160,0,177,207,145,203,24,165,203,105,1,133,203,144,2,230,204,24,165,207,105,1bb133,207,144,2,230,20Jl}8,165,208,197,206,208,224,165,207,197,205,208,218,24,165,207,105,149,133 ]]207,165,208,105,0,133,208,160,0,165,203,133,4,1Jm}65,204,133,5,177,207,145,203,200,192,158*[[208,247,24,165,203,105,158,141,231,2,165,204,105,0,141,232,2,169,7,164,203,166,Jn}204,324TT92,228,76,0,160,173,31,208,201,7,208,6,169,0,133,2,240,117,201,6,208,113,165,2>UU208,109,73,1,133,2,160,0,24,1Jo}65,4,105,133,133,203,165,5,105,0,133,204,132,3,177HRR203,32,0,0,164,3,200,192,18,208,242,24,165,4,105,90,133,6,165,5,105,0Jp},72,165RNN6,72,169,10,72,169,0,72,169,10,72,169,0,72,169,2,72,165,1,72,165,0,72,96\UU169,155,32,0,0,160,0,24,165,4,105,Jq}151,133,203,165,5,105,0,133,204,132,3,177,203fXX32,0,0,164,3,200,192,6,208,242,169,143,141,252,2,76,98,228,125,201,206,211Jr},212,193pGG206,212,32,210,197,206,213,205,194,197,210,155,82,69,65,68,89,155D:RENUMBER.BASbbbbbbbbbbbbbbbbbbbbbbbJs}bbbbbbb3pGG206,212,32,210,197,206,213,205,194,197,210,155,82,69,65,68,89,155D:RENUMBER.BASbbbbbbbbbbbbbbbbbbbbbbbHFrom A.N.A.L.O.G. Computing, Issue #27, February 1985Instant Renumber16K Cassette or 24K Diskby Angelo Giambra How would you Nu}like to instantly renumber any BASIC program by merelypressing the START key on yor computer console? Instant Renumber will lNv}oadinto your computer a machine language renumber utility, which will jumpinto action every time you press the START key. HerNw}e's how to use it. Loading it in. First, key in Instant Renumber, making sure to key the data Nx}statementsaccurately. Save it to cassette or disk before running it. There are tworeasons for this: first, if you made any erNy}rors keying in the DATAstatements, your system will probably lock up when you run the program.Second, after the program runs Nz}correctly, it self-destructs. I'll explainwhy later. After you've saved the proram, run it. Your screen will go black for aboN{}utthirty seconds while the DATA statements are being read into memory. Finally,you will see a message similar to the followinN|}g on your screen: RENUMBER INSTALLED AT DECIMAL ADDRESS N}} 7292 On your computer, this number may differ. Jot this address down on a pieceof paper for reference. I'll explain N~}why later in this article. Instant Renumber is now resident. It will remain on the job until you pressSYSTEM RESET or turn ofN}f your computer. Using it. To activate it, load any BASIC program into memory. List a few liN}nes of iton your screen. Now press the START key on your console. The message INSTANTRENUMBER appears on your screen, and a sN}econd later the READY prompt appears.Your program has just been renumbered in increments of ten. This renumber utility resolvN}es all references to line numbers in statementssuch as GOTO, GOSUB, IF...THEN, etc. If the utility encounters no problems, itN} simply ends with the READY prompt.Otherwise, after resequencing your program, it reports problems to you in thefollowing manN}ner. Suppose you have this program line: 50 GOSUB 1000 If Line 1000 is nonexistent, Instant RenuN}mber reports it this way: NF 50 This means that, on Line 50, the target address (1000) was noN}t found. Youmust correct incorrect line numbers manually. Symbolic references are handled in a similar manner. Consider this N}line ofBASIC: 20 GOTO NEXTLINE Instant Renumber will report this as follows: N} SR 20 This means that, on Line 20, there is a symbolic reference. You'll have toadjust these yourself. Not all meN}ssages indicate an error. Sometimes we turn off the TRAP statementby assigning it to a non-existent number, such as TRAP 4000N}0. The InstantRenumber program will report lines which use this convention with an NFmessage, although they are not truly errN}ors. Never activate Instant Renumber until you have listed the program to thescreen. It is not necessary to list the entire pN}rogram. Just type in LIST,press RETURN, then immediately press the BREAK key. You must do this,because BASIC keeps a set of iN}nternal pointers which tell it where programlines begin and end. When you add or delete lines, BASIC sometimes does notupdateN} its pointers until several changes have been made. Instant Renumberneeds these pointers to be current. Listing the program fN}orces BASIC to doan update. Sometimes you may want to renumber your program in increments other thanten. Instant Renumber mayN} be activated manually. Earlier, I told you to jotdown the decimal address that appears on the screen after the utilityinstalN}ls itself. To manually run it, key in a USR statement like thefollowing: X=USR(7292,100,5) In thisN} example, 7292 represents the decimal address you jotted down.Remember, your number may differ. The next number, 100, is the N}base number.It tells Instant Renumber that you want your first program line to beresequenced as Line 100. The last number, 5,N} tells the utility to incrementeach successive line by 5. How it works. Here's how the program worN}ks. It first installs Instant Renumber in lowmemory. This varies on different systems, depending on -- among other things-- wN}hether you have cassette or disk. It protects the utility by altering theLOMEM pointer to point to the end of the machine lanN}guage code. That way,BASIC will never use the memory occupied by Instant Renumber. That's why theprogram vanishes after you rN}un it. Altering the LOMEM pointer forces BASICto realign all of its internal pointers, and it loses track of where thecurrentN} program is! Next, the program activates a vertical blank interrupt routine, which alsoresides in low memory. A VB interrupt N}routine is a series of instructions yourcomputer executes every sixtieth of a second. You don't know its running,but it is alN}ways there. The VB interrupt is constantly checking to see ifyou have pressed the START key. If you have, it activates InstanN}t Renumber. One final note for those of you with disk drives. When you key in DOS,the DUP.SYS file begins to load into the saN}me area of memory occupied bythe VB interrupt routine. Normally, this would cause the system to lock up.The program guards agN}ainst this by providing an automatic SYSTEM RESET thefirst time you key in DOS. Instead of going to the familiar DOS menu, yoN}urscreen will flicker, and you will remain in BASIC. Simply key in DOS again togo to the DOS menu. N} Fast relief. Because Instant Renumber is written entirely in machine language, it isincredibly fast. Even programs which N}exceed 500 lines are renumbered inless than two seconds. I think you'll find Instant Renumber an invaluable tool. RenumberingN} yourBASIC program was never so easy.N} was never so easy.L